package de.dnb.gnd.utils.formatter;

import de.dnb.gnd.parser.Record;
import de.dnb.gnd.parser.Subfield;
import de.dnb.gnd.utils.RecordUtils;

public class Pica3Formatter extends AbstractFormatter {

	@Override
	protected String format(final Subfield subfield) {
		if (printNoDollar()) {
			String s = subfieldPre;
			// erstes Unterfeld ohne Indikator?
			if (isFirstSubfield
				&& actualIndicator == actualTag.getDefaultFirst()) {
				s += formatContent(subfield.getContent());
			}
			// Prä- und Postfix:
			else if (actualIndicator.prefix != null) {
				String prefix;
				/* 
				 * Alternatives Präfix wird benutzt, wenn Indikator nicht an 
				 * erster Stelle und nicht anschliessend ist:
				 */
				if (!isFirstSubfield && actualIndicator.prefixAlt != null
					&& !actualIndicator.isAttaching) {
					prefix = actualIndicator.prefixAlt;
				} else if (isFirstAttaching
					&& actualIndicator.prefixAlt != null) {
					prefix = actualIndicator.prefix;
					isFirstAttaching = false;
				} else if (!isFirstAttaching
					&& actualIndicator.prefixAlt != null) {
					prefix = actualIndicator.prefixAlt;
				} else {
					prefix = actualIndicator.prefix;
				}
				// postfix immer != null:
				s +=
					prefix + formatContent(subfield.getContent())
						+ actualIndicator.postfix;
			}
			s += subfieldPost;
			return s;
		} else
			// Standardverhalten für GND, also $<indikator>:
			return super.format(subfield);
	}

	/**
	 * @return
	 */
	private boolean printNoDollar() {
		return (isFirstSubfield && actualIndicator == actualTag
			.getDefaultFirst()) || actualIndicator.prefix != null;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Record record = RecordUtils.readFromClip();
		Pica3Formatter formatter = new Pica3Formatter();
		System.out.println(formatter.format(record));
	}

}
